package com.itheima.common;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * <p>Description: 自定义元数据对象处理器</p>
 *
 * @author liuyiming
 * @date 2022-10-09 9:41
 * @version 1.0.0
 */
@Component
@Slf4j
public class MyMetaObjecthandler implements MetaObjectHandler {
    /**
     * <p>Description: 插入的时候自动填充</p>
     *
     * @author liuyiming
     * @date 2022-10-09 9:45
     * @version 1.0.0
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("公共字段自动填充[insert]...");
        //MetaObject中有个属性originalObject，这里装的数据是前端发送的数据
        //前端发送的数据中是没有审计字段的，所以要在这自动填充
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
        /*
        * createUser和updateUser存放的数据内容是当前登录的用户ID，是从session中获取的
        * 但是当前类无法获取session，所以就要用BaseContext中的ThreadLocal工具，
        * 因为当前线程的执行流程流程是先执行拦截器的，拦截器中是可以从session中获取id的
        * 在拦截器的时候就会把id存入ThreadLocal中，这个id就会保存在当前线程中，且只有在当前线程中有效
        * 所以既可以在当前类中从ThreadLocal获取出id
        * */
        metaObject.setValue("createUser", BaseContext.getCurrentId());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }

    /**
     * <p>Description: 修改的时候自动填充</p>
     *
     * @author liuyiming
     * @date 2022-10-09 9:46
     * @version 1.0.0
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("公共字段自动填充[update]...");
        metaObject.setValue("updateTime", LocalDateTime.now());
        metaObject.setValue("updateUser", BaseContext.getCurrentId());
    }
}
